package com.whsxt.servlet;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import com.whsxt.common.CodeMsg;
import com.whsxt.common.Constant;
import com.whsxt.common.Result;
import com.whsxt.pojo.User;
import com.whsxt.service.UserService;
import com.whsxt.service.impl.UserServiceImpl;
import com.whsxt.util.RespUtil;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author 武汉尚学堂
 */
@WebServlet("/user.do")
@MultipartConfig//表示当前servlet支持文件上传数据解析 默认servlet不支持
public class UserServlet extends HttpServlet {


    private UserService userService = new UserServiceImpl();


    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String service = req.getParameter("service");
        try {
            //通过反射调用方法
            Method m = this.getClass().getDeclaredMethod(service, HttpServletRequest.class, HttpServletResponse.class);
            m.invoke(this, req, resp);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 登录方法
     *
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String checkCode = req.getParameter("checkCode");
        //校验验证码的合法性
        Object code = req.getSession().getAttribute(Constant.VERCODE_KEY);
        //验证码错误
        if (code == null || !StrUtil.equalsIgnoreCase(checkCode, code.toString())) {
            Result rs = new Result(CodeMsg.VERCODE_ERROR);
            RespUtil.writer(resp, rs);
            return;
        }
        Result rs = userService.login(username, password);
        //如果登录成功 则将当前用户放入到session
        if (rs.getCode().equals(CodeMsg.SUCCESS.code)) {
            Object data = rs.getData();
            req.getSession().setAttribute(Constant.CURRENT_USER_KEY, data);
            rs.setData(null);
        }
        //将登录结果返回给浏览器
        RespUtil.writer(resp, rs);
    }


    /**
     * 分页查询员工信息
     *
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void page(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String page = req.getParameter("page"); //页码
        String limit = req.getParameter("limit"); //每页数据条数  layui 会默认传输的参数
        //获取查询参数
        String realname = req.getParameter("realname");
        String role = req.getParameter("role");
        String deleted = req.getParameter("deleted");
        //将查询参数进行封装
        Map<String, String> params = new HashMap<>();
        if (StrUtil.isNotBlank(realname)) {
            params.put("realname", realname);
        }
        if (StrUtil.isNotBlank(role)) {
            params.put("role", role);
        }
        if (StrUtil.isNotBlank(deleted)) {
            params.put("deleted", deleted);
        }
        //获取员工数据
        Result rs = userService.queryPage(params, page, limit);
        //将数据返回
        RespUtil.writer(resp, rs);

    }

    /**
     * 新增员工
     *
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String role = req.getParameter("role");
        String realname = req.getParameter("realname");
        //新增员工数据
        Result rs = userService.addUser(username, realname, role);
        //将数据返回
        RespUtil.writer(resp, rs);
    }

    /**
     * 重置密码
     *
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void resetPass(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String id = req.getParameter("id");
        //重置员工密码
        Result rs = userService.resetPassword(id);
        //将数据返回
        RespUtil.writer(resp, rs);
    }

    /**
     * 员工离职
     *
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void del(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String id = req.getParameter("id");
        //修改员工状态
        Result rs = userService.delete(id);
        //将数据返回
        RespUtil.writer(resp, rs);
    }

    /**
     * 获取所有的业务员
     *
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void allSalesman(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //查询所有 有效的业务员
        Result rs = userService.queryAllSalesman();
        //将数据返回
        RespUtil.writer(resp, rs);
    }

    /**
     * 退出
     *
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void logout(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        //移除session作用域的值
        session.removeAttribute(Constant.CURRENT_USER_KEY);
        session.invalidate();//销毁session
        resp.sendRedirect("index.jsp");
    }

    /**
     * 修改用户密码
     *
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void updatePassword(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        User user = (User) session.getAttribute(Constant.CURRENT_USER_KEY);
        String password = req.getParameter("password");//获取用户输入的原始密码
        String newPassword = req.getParameter("newPassword");//获取用户输入的新密码
        //对比用户输入的密码 和当前密码是否一致
        if (!StrUtil.equals(password, user.getPassword())) {
            Result rs = new Result(CodeMsg.USERPASSWORD_NOT_SAME_ERROR);
            RespUtil.writer(resp, rs);
            return;
        }
        //修改密码
        Result rs = userService.updatePassword(user.getId(), newPassword);
        //说明修改成功了
        if (rs.getCode().equals(CodeMsg.SUCCESS.code)) {
            session.removeAttribute(Constant.CURRENT_USER_KEY);
        }
        RespUtil.writer(resp, rs);
    }

    /**
     * 修改用户的头像
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void updateImg(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.getParameter("key");
        //每个部分的name的值
       /* Part part1 = req.getPart("id"); //getPart 就是获取客户端传输过来的数据  服务器使用流进行存储
        InputStream inputStream = part1.getInputStream();
        byte[] b = new byte[1024];
        int len = inputStream.read(b);
        System.out.println(new String(b,0,len));
        System.out.println(part1.getContentType());
        Part part3 = req.getPart("userImg");
        System.out.println(part3.getContentType());*/
        //在servlet 3.0之后  是支持文件上传的  但是必须在servlet添加 @MultipartConfig 表示支持 Multipart 格式数据解析
        // 普通的文本数据 使用
        String id = req.getParameter("id");
        String name = req.getParameter("name");
        System.out.println(id + "  " + name);
        //文件流数据使用 getPart 进行获取
        Part userImg = req.getPart("userImg");
        //write(fileName) : fileName 就是文件路径
        //write(fileName) : 就是将文件数据 保存到该路径
        //userImg.write("D:\\java201130.jpg");
        //磁盘路径  文件保存的路径   就是保存在tomcat服务上的某个文件夹
        //访问路径  url   127.0.0.1:8080/cms/xxx/文件名称  一般而言,保存在数据库的是  访问路径  访问路径需要给客户端访问
        //由于现在要保存到  当前项目的imgs文件夹  imgs文件夹在tomcat服务器上
        //找到tomcat的绝对路径 在tomcat的绝对路径的基础上 找到imgs文件夹的绝对路径
        //1. tomcat的物理路径
        String realPath = req.getServletContext().getRealPath("/imgs"); //保存图片的文件夹的磁盘路径前缀
        //2. 网络访问路径
        //127.0.0.1:8080/cms/imgs/文件名称  全路径 也是绝对路径   一般保存相对路径  imgs/文件名称
        //因为 ip  端口  项目名称 可能发生改变  如果保存了全路径  一旦发生改变 所有的数据就要修改
        //保存相对路径  哪怕 前缀变了  可以使用 拼接方式 进行适应
        String url = "imgs/";
        String name1 = userImg.getName();
        System.out.println(name1);//文件域的name属性值
        System.out.println(userImg.getSize());//获取文件的大小
        //form-data; name="userImg"; filename="pig.jpg"
        String header = userImg.getHeader("Content-Disposition");
        String[] split = header.split(";");
        String fileNameInfo = split[2].trim();//filename="pig.jpg"
        int index = fileNameInfo.indexOf("\"");
        int lastIndex = fileNameInfo.lastIndexOf("\"");
        String fileName = fileNameInfo.substring(index + 1, lastIndex);//文件的真实名称

        //保存文件的具体的路径  由于系统支持多个用户的  可能用户上传的文件名称一样 如果直接使用文件的原名称
        //可能发生文件覆盖的问题
        //基于这样的情况  产生一个文件命名问题  使用时间戳作为名称 + 后缀
        String ext = FileUtil.extName(fileName);
        String time = DateUtil.format(new Date(), "yyyyMMddHHmmss");
        fileName = time + "." + ext;
        realPath = realPath + File.separator + fileName; //
        //文件的访问路径
        url = url + fileName;
        //保存文件
        userImg.write(realPath);
        //修改数据库中 img的值
        User user = (User) req.getSession().getAttribute(Constant.CURRENT_USER_KEY);
        Result rs = userService.updateImg(user.getId(), url);
        RespUtil.writer(resp, rs);
    }


}
